//题目：
// 给定一个整数数组prices，其中第  prices[i] 表示第 i 天的股票价格 。​
// 设计一个算法计算出最大利润。在满足以下约束条件下，你可以尽可能地完成更多的交易（多次买卖一支股票）:
// 卖出股票后，你无法在第二天买入股票 (即冷冻期为 1 天)。
// 注意：你不能同时参与多笔交易（你必须在再次购买前出售掉之前的股票）。
#include<iostream>
#include<vector>

using namespace std;
//代码
class Solution 
{
public:
    int maxProfit(vector<int>& prices) 
    {
        //第i天我可能有三种状态：“可买入”、“已买入”、“冷冻期”
        int m=prices.size();
        //1.创建dp细化表————dp[i][]表示在第i天所赚取的最大金额
        vector<vector<int>> dp(m,vector<int>(3,0));
        //2.初始化
        dp[0][0]=0,dp[0][1]=0-prices[0],dp[0][2]=0;
        //3.填表————动态转移方程：dp[i][0]=max(dp[i-1][0],dp[i-1][2])  (昨天是“可买入” || 昨天是冷冻期) && 今天没买
        //                      dp[i][1]=max(dp[i-1][0]-prices[i],dp[i-1][1]) (昨天是“可买入” && 今天买了) || (昨天买了 && 今天没卖)
        //                      dp[i][2]=dp[i-1][1]+prices[i]  昨天是“已买入” && 今天卖了
        for(int i=1;i<m;i++)
        {
            dp[i][0]=max(dp[i-1][0],dp[i-1][2]);
            dp[i][1]=max(dp[i-1][0]-prices[i],dp[i-1][1]);
            dp[i][2]=dp[i-1][1]+prices[i];
        }
        //4.确定返回值
        return max(dp[m-1][0],dp[m-1][2]);
    }
};